package nix.dom4j;

import java.io.FileOutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;
import org.xml.sax.DocumentHandler;

public class TestDom4j {

	/**
	 * 获得所有name节点的值
	 */
	@Test
	public void selectTags() throws Exception {
		// 获得解析器实例
		SAXReader reader = new SAXReader();
		// 解析XML获得文档实例
		Document document = reader.read("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得所有person子节点
		List<Element> list = root.elements("person");
		// 遍历
		for (Element element : list) {
			// 获得name子节点
			Element name1 = element.element("name");
			// 输出name节点内容
			System.out.println(name1.getText());
		}
	}

	/**
	 * 获得第一个name的值
	 */
	@Test
	public void selectFirstTag() throws Exception {
		// 获得解析器实例
		SAXReader reader = new SAXReader();
		// 解析XML获得文档实例
		Document document = reader.read("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得第一个person子节点
		Element p1 = root.element("person");
		// 获得第一个name子节点
		Element n1 = p1.element("name");
		// 输出name节点内容
		System.out.println(n1.getText());
	}

	/**
	 * 获得第二个name的值
	 */
	@Test
	public void selectSecondTag() throws Exception {
		// 获得解析器实例
		SAXReader reader = new SAXReader();
		// 解析XML获得文档实例
		Document document = reader.read("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得所有person子节点
		List<Element> list = root.elements("person");
		// 获得第二个person子节点
		Element p2 = list.get(1);
		// 获得第一个name子节点
		Element n1 = p2.element("name");
		// 输出name节点内容
		System.out.println(n1.getText());
	}

	/**
	 * 在末尾添加一个子节点
	 */
	@Test
	public void addTag() throws Exception {
		// 获得解析器实例
		SAXReader reader = new SAXReader();
		// 解析XML获得文档实例
		Document document = reader.read("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得第一个person子节点
		Element p1 = root.element("person");
		// 添加gender子节点
		Element g1 = p1.addElement("gender");
		// 设置内容
		g1.setText("male");
		// 设置输出格式
		OutputFormat format = OutputFormat.createPrettyPrint(); // 格式化
		// OutputFormat format = OutputFormat.createCompactFormat(); // 压缩
		XMLWriter writer = new XMLWriter(new FileOutputStream("src/nix/dom4j/person.xml"), format);
		// 内存回写文件
		writer.write(document);
		writer.close();
	}

	/**
	 * 在特定位置添加一个节点
	 */
	@Test
	public void addTagBefore() throws Exception {
		// 解析XML获得文档实例（调用封装方法）
		Document document = Dom4jUtils.getDocument("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得第一个person子节点
		Element p1 = root.element("person");
		List<Element> list = p1.elements();
		// 新建school节点
		Element school1 = DocumentHelper.createElement("school");
		// 设置文本
		school1.setText("abc");
		// 特定位置添加
		list.add(1, school1);
		// 内存回写文件（调用封装方法）
		Dom4jUtils.writeXML("src/nix/dom4j/person.xml", document);
	}
	
	/**
	 * 修改节点的值
	 */
	@Test
	public void modifyTagText() {
		// 获得Document对象
		Document document = Dom4jUtils.getDocument("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得第一个person子节点
		Element p1 = root.element("person");
		// 获得第一个age子节点
		Element age1 = p1.element("age");
		// 设置内容
		age1.setText("50");
		// 回写文件
		Dom4jUtils.writeXML("src/nix/dom4j/person.xml", document);
	}
	
	/**
	 * 删除节点
	 */
	@Test
	public void removeTag() {
		// 获得Document对象
		Document document = Dom4jUtils.getDocument("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得第一个person子节点
		Element p1 = root.element("person");
		// 获得第一个school子节点
		Element school1 = p1.element("school");
		// 删除子节点
		p1.remove(school1);
		// 回写文件
		Dom4jUtils.writeXML("src/nix/dom4j/person.xml", document);
	}
	
	/**
	 * 获得属性的值
	 */
	@Test
	public void getAttrVal() {
		// 获得Document对象
		Document document = Dom4jUtils.getDocument("src/nix/dom4j/person.xml");
		// 获得根节点
		Element root = document.getRootElement();
		// 获得第一个person子节点
		Element p1 = root.element("person");
		// 获得id属性的值
		String id = p1.attributeValue("id");
		System.out.println(id);
	}
}
